/*
 * SoftwareSAR - 1.0
 */
package br.com.cpqd.ssar.mediador;

import br.com.cpqd.ssar.mediador.gui.JanelaRemoverFonteEletromagnetica;
import br.com.cpqd.ssar.mediador.gui.JanelaCriarFonteEletromagneticaSimulacao;
import br.com.cpqd.ssar.mediador.gui.JanelaEditarFonteEletromagneticaSimulacao;
import br.com.cpqd.ssar.utilitarias.FonteEletromagnetica;
import br.com.cpqd.ssar.utilitarias.FonteEletromagneticaSimulacao;
import br.com.cpqd.ssar.utilitarias.ListaFontesEletromagneticasSimulacao;
import br.com.cpqd.ssar.utilitarias.ListaFontesEletromagneticas;
import java.io.IOException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultComboBoxModel;

/**
 * Classe que Controla a Tudo referente as Fontes Eletromagneticas do Sistema
 * Nesse caso é importante destacar que 
 *  - FontesEletromagneticasSimulacao: todos os atributos e métodos terminados 
 *    em Simulacao (criarFonteSimulacao) estão relacionados as fontes inseridas 
 *    em uma cena de simulação;
 *  - TiposFontesEletromagneticas: são as fontes modeladas no FDTD3D, que não são
 *    editáveis manualmente;
 *  - FontesEletromagneticas: são as fontes da base de dados dos usuários.
 * @author Carlos Henrique da Silva Santos
 * @version 2.0
 */
public class ControladorFonteEletromagnetica {

    /*
     * Verificador de insercao ou nao de Fonte Eletromagnetica na cena
     */
    private boolean fonteInserida;
    
    /*
     * Listagem com as Fontes Cadastradas pelo Usuario (base de fontes)
     */
    private ListaFontesEletromagneticas listaFontes;
    /*
     * Lista com as fontes eletromagneticas utilizadas em uma simulacao
     */
    private ListaFontesEletromagneticasSimulacao listaFontesSimulacao;

    /*
     * Fonte Simulacao que será manipulada na Lista
     */
    private FonteEletromagneticaSimulacao fonteEletromagneticaSimulacao;
    /*
     * Nome do arquivo que contem os dados das Fontes Eletromagneticas da Cena 
     * de Simulacao
     */
    String nomeArquivoFontesSimulacao;

    /*
     * Nome do Arquivo de Fontes Eletromagneticas a ser utilizado pelo FDTD 3D
     */
    String nomeArquivoFontesFDTD;
    
    /*
     * Coordenadas a serem repassadas para a atividade solicitada para a Fonte 
     * de Simulacao
     */
    Vector coordenadasFonteSimulacao;

    /**
     * Método que armazena as coordenadas da Fonte Eletromagnetica da Simulacao
     * @param controlador ControladorFonteEletromagnetica
     */
    public FonteEletromagneticaSimulacao callJanelaInserirFonteEletromagnetica(int posicao) {
        fonteInserida = false;
        fonteEletromagneticaSimulacao = null;
        try {
            ListaFontesEletromagneticas lista = new ListaFontesEletromagneticas();
        } catch (IOException ex) {
            Logger.getLogger(ControladorFonteEletromagnetica.class.getName()).log(Level.SEVERE, null, ex);
        }
        JanelaCriarFonteEletromagneticaSimulacao janelaFonteSimulacao = new JanelaCriarFonteEletromagneticaSimulacao(
                new javax.swing.JFrame(), true, this.coordenadasFonteSimulacao, posicao);
        fonteEletromagneticaSimulacao = janelaFonteSimulacao.getFonteSimulacao();
        return fonteEletromagneticaSimulacao;
    }
    /*
     * Chamada para a janela de remocao de fontes eletromagneticas do usuario
     */
    public void callJanelaRemoverFonteEletromagnetica() throws IOException{
//public void callJanelaRemoverFonteEletromagnetica(ControladorFonteEletromagnetica controlar) throws IOException{
        JanelaRemoverFonteEletromagnetica janelaRemoverFonte;
        try {
             janelaRemoverFonte = new JanelaRemoverFonteEletromagnetica(new javax.swing.JFrame(), true);
            janelaRemoverFonte.setVisible(true);
        }
        catch (Exception e) {
        }
    }

   /*
     * Chamada para a janela de edicao das fontes eletromagneticas da simulacao
     */
    public void callJanelaEditarFonteEletromagneticaSimulacao(ControladorFonteEletromagnetica controlar, FonteEletromagneticaSimulacao temp){        
        JanelaEditarFonteEletromagneticaSimulacao janelaEditarFonteSimulacao = new JanelaEditarFonteEletromagneticaSimulacao(new javax.swing.JFrame(), true, controlar, temp);
    } 
    /**
     * Retorna se a fonte foi inserida
     * @return
     */
    public boolean getInserirFonte(){
        return fonteInserida;
    }

    
    /**
     * Método que armazena as coordenadas da Fonte Eletromagnetica da Simulacao
     * @param coordenadas Vector
     */
    public void setCoordenadas(Vector coordenadas) {
        coordenadasFonteSimulacao = new Vector();
        this.coordenadasFonteSimulacao = coordenadas;

    }

    /*
     * Atribuindo a Fonte que será manipulada dentro da Lista de Fontes de Simulacao
     */
    public void setFonteEletromagneticaSimulacao(FonteEletromagneticaSimulacao fonte) {
        this.fonteEletromagneticaSimulacao = new FonteEletromagneticaSimulacao();
        this.fonteEletromagneticaSimulacao = fonte;
    }

    /*
     * Interface para o cadastramento de nova Fonte Eletromagnetica na Simulacao
     * Necessario que previamente seja informada as coordenadas dessa font
     * através do método setCoordenadas(Vector)
     */
    public void inserirFonteEletromagneticaSimulacao() {        
        //adicionarFonteSimulacao();
        this.fonteInserida = true;
        fonteEletromagneticaSimulacao.setIdFonte(listaFontesSimulacao.size());
        listaFontesSimulacao.adicionarFonteSimulacao(fonteEletromagneticaSimulacao);        
    }

    /**
     * Método Construtor
     */
    public ControladorFonteEletromagnetica() {
        try {
            listaFontesSimulacao      = new ListaFontesEletromagneticasSimulacao();
            listaFontes               = new ListaFontesEletromagneticas();
            coordenadasFonteSimulacao = new Vector();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Informa o endereco completo do arquivo que contem a base de dados das 
     * informacoes das fontes utilizadas na simulacao
     * @param nome String
     */
    public void setArquivoListaFontesSimulacao(String nome) {
        this.nomeArquivoFontesSimulacao = new String();
        this.nomeArquivoFontesSimulacao = nome;
        listaFontesSimulacao.setArquivoListaFontesSimulacao(nomeArquivoFontesSimulacao);
        //listaFontesSimulacao.iniciarFontesEletromagneticasSimulacao();
    }
    
    /**
     * Retorna o nome do arquivo que armazena a lista de fontes eletromagneticas 
     * utilizadas na simulacao
     * @return nomeArquivo string
     */
    public String getArquivoListaFontesSimulacao(){
        return this.nomeArquivoFontesSimulacao;
    }

    /**
     * Adicionar Fonte Eletromagnética informada pelo usuário
     * @param fonte FonteEletromagnetica
     * @exception IOException
     */
    public void adicionarFonte(FonteEletromagnetica fonte) throws IOException {
        listaFontes.adicionarFonte(fonte);
    }

   
    /**
     * Salvar as fontes eletromagneticas inseridas na simulacao
     * @return funcionou Boolean
     */
    public boolean salvarFontesSimulacao(){
        return listaFontesSimulacao.salvarListaFonteSimulacao();
    }
    /**
     * Editar Fonte Eletromagnética informada pelo usuário
     * @param fonte FonteEletromagnetica
     * @exception IOException
     */
    public void editarFonte(FonteEletromagnetica fonte) throws IOException {
        listaFontes.editarFonte(fonte);
    }

    /**
     * Editar Fonte Eletromagnética da Simulacao informada pelo usuário
     * @param fonte FonteEletromagneticaSimulacao
     */
    public void editarFonteSimulacao(FonteEletromagneticaSimulacao fonte) throws IOException {
        listaFontesSimulacao.editarFonteSimulacao(fonte);
    }

    /**
     * Remover FonteEletromagnetica do cadastro de usuários
     * @param fonte FonteEletromagnetica
     */
    public void removerFonteEletromagnetica(FonteEletromagnetica fonte) {
        listaFontes.removerFonte(fonte);
      
    }

    /**
     * Remover FonteEletromagnetica da Simulacao
     * @param fonte FonteEletromagneticaSimulacao
     */
    public boolean removerFonteEletromagneticaSimulacao(FonteEletromagneticaSimulacao fonte) {
        return listaFontesSimulacao.removerFonteSimulacao(fonte);
    }

    /**
     * Retornar o valor modelo das Fontes cadastradas no sistema de acordo 
     * com o FDTD 3D.
     * @return modelo DefaultComboBoxModel
     */
    public DefaultComboBoxModel getModelo() {
        return listaFontes.getModelo();
    }

    /**
     * Retornar o valor modelo das Fontes dos usuário
     * @return modeloEditavel DefaultComboBoxModel
     */
    public DefaultComboBoxModel getModeloEditavel() {
        return listaFontes.getModeloEditavel();
    }

    /**
     * Retornar o valor modelo de edição que é referente as Fontes 
     * eletromagnéticas utilizadas pelo usuário em uma simulação.
     * @return modeloEditavelSimulacao DefaultComboBoxModel
     */
    public DefaultComboBoxModel getModeloEditavelSimulacao() {
        return listaFontesSimulacao.getModeloEditavelSimulacao();
    }
    
    
    /**
     * Atribuir o endereco e o nome do arquivo de fontes eletromagneticas do FDTD
     * @param nomeArquivoFonteFDTD String
     */
    public void setNomeArquivoFonteFDTD(String nome){
        this.nomeArquivoFontesFDTD = nome;
        listaFontesSimulacao.setNomeArquivoFDTD(this.nomeArquivoFontesFDTD);
    }
    
    /**
     * Configurar as fontes eletromagneticas a serem utilizadas pelo FDTD 
     * durante as simulacoes
     
    public void configurarFontesFDTD(){
        listaFontesSimulacao.configurarFontesFDTD();        
    }*/
    
    /**
     * Atribuir os Limites da Simulacao (MinX, MaxX, MinY, MaxY, MinZ, MaxZ)
     * @param limites Vector
     */
    public void setLimitesSimulacaoFDTD(Vector limites){
        
    }
    /*
     * Retornar a quantidade de Fontes Eletromagneticas inseridas na Simulacao
     */
    public int sizeFontesSimulacao(){
        return listaFontesSimulacao.size();
    }
    
    /**
     * Retorna a fonte eletromagnetica da simulacao solicitada pelo indice
     * @param id Int
     * @return fonte FonteEletromagnetica
     */
    public FonteEletromagneticaSimulacao getFonteEletromagneticaSimulacao(int id){
        FonteEletromagneticaSimulacao temp;
        for (int cont=0; cont < listaFontesSimulacao.size(); cont++){
            temp=listaFontesSimulacao.getFonteSimulacao(cont);
            if (temp.getIdFonte()==id)
                return temp;           
        }
        return null;
    }
    
    /**
     * Retornar a listagem completa de fontes eletromagnéticas utilizadas na simulacao
     * @return listaFontes ListaFontesEletromagneticasSimulacao
     */
    public ListaFontesEletromagneticasSimulacao getListaFonteEletromagneticaSimulacao(){
        return listaFontesSimulacao;
    }
    
    /**
     *  Iniciar a Listagem de Fontes Eletromagneticas da Simulacao
     * @param fontes ListaFontesEletromagneticasSimulacao
     */
    public void iniciarListaFontesEletromagneticasSimulacao(ListaFontesEletromagneticasSimulacao lista){
        this.listaFontesSimulacao = lista;
    }
            
    
    
}
